home *** CD-ROM | disk | FTP | other *** search
File List | 1990-11-14 | 4.6 KB | 119 lines |
- ' How to format a disk without reinventing the wheel.
- '
- ' Procedure calling example. Formats drive B: with one side,
- ' giving it the name HELLO.DIS.
- '
- format(1,1,"HELLO.DIS")
- END
- '
- ' And now, the actual procedure. . .
- '
- PROCEDURE format(drive%,maxside%,diskname$)
- '
- ' Floppy disk formatting code for GFA BASIC 3.0
- ' (modified from MichTron Disk Format code)
- '
- ' Parameters:
- ' drive% -- disk drive number (0=A:, 1=B:)
- ' maxside% -- sides to format (1 or 2)
- ' diskname$ -- disk volume name
- '
- ' Error checking for drive number
- IF drive%=0 OR drive%=1
- ' Error checking for number of sides
- IF maxside%=1 OR maxside%=2
- ' NOTE: Error checking is not provided here for diskname$.
- ' It can be any valid filename ("12345678.123") or a
- ' null string ("")
- '
- ' And now for the formatting variables.
- ' Play around with them. if you dare,
- ' but be carefull!
- '
- maxtrack%=80 ! Number of tracks to format: 80
- maxsector%=9 ! Number of sectors per track: 9
- interleave%=1 ! Interleave factor: 1
- ' change to 11 for 'twisted' format
- secdir%=7 ! Number of sectors for directory: 7
- secfat%=5 ! Number of sectors for FAT: 5
- ' change to 3 for IBM compatible format
- cntfat%=2 ! Number of FATs: 2
- spc%=2 ! Sectors per cluster: 2
- media%=249 ! Medium description (whatever that means): 249
- '
- buffer$=SPACE$(10000) ! Set up a buffer
- buffer%=VARPTR(buffer$) ! and a pointer to it
- abort&=FALSE ! Abort flag
- ' Format sides
- FOR i%=0 TO maxside%-1
- IF abort&=FALSE
- error%=XBIOS(10,L:buffer%,L:0,drive%,maxsector%,0,i%,interleave%,L:&H87654321,0)
- ENDIF
- IF error%
- abort&=TRUE
- ENDIF
- NEXT i%
- ' Format tracks
- FOR i%=1 TO maxtrack%-1
- FOR j%=0 TO maxside%-1
- IF abort&=FALSE
- error%=XBIOS(10,L:buffer%,L:0,drive%,maxsector%,i%,j%,interleave%,L:&H87654321,&HE5E5)
- ' Display what's going on to the user
- PRINT AT(1,1);"Track: "+STR$(i%)+" Side: "+STR$(j%)
- ENDIF
- IF error%
- abort&=TRUE
- ENDIF
- NEXT j%
- NEXT i%
- IF abort&=FALSE ! If there's been no error
- ' Determine type of disk for boot sector
- ' 0 = one side, 40 tracks (stone-age)
- ' 1 = two sides, 40 tracks (likewise)
- ' 2 = one side, 80 tracks
- ' 3 = two sides, 80 tracks
- type%=0
- IF maxtrack%>70 ! High density
- ADD type%,2
- ENDIF
- IF maxside%=2
- ADD type%,1
- ENDIF
- ~XBIOS(18,L:buffer%,L:0,type%,0) ! Create boot sector
- length%=maxtrack%*maxsector%*maxside%
- ' Adjust boot sector
- POKE buffer%+13,spc% ! Sectors per cluster
- POKE buffer%+16,cntfat% ! Number of FATs
- POKE buffer%+17,(secdir%*16) AND &HFF ! Number of possible directory
- POKE buffer%+18,(secdir%*16)/256 ! entries (in low byte-high byte format)
- POKE buffer%+19,(length%) AND &HFF ! Number of sectors on disk
- POKE buffer%+20,(length%)/256 ! (low byte-high byte format, again)
- POKE buffer%+21,media% ! Medium description, whatever that is
- POKE buffer%+22,(secfat%) AND &HFF ! Sectors per FAT
- POKE buffer%+23,(secfat%)/256 ! (low byte-high byte)
- POKE buffer%+24,(maxsector%) AND &HFF ! Sectors per track
- POKE buffer%+25,(maxsector%)/256 ! (you guessed it)
- ~XBIOS(9,L:buffer%,L:0,drive%,1,0,0,1) ! Write adjusted boot sector
- ' Build a FAT, somehow, then write it
- buffer$=CHR$(media%)+CHR$(255)+CHR$(255)+STRING$(509,0)
- FOR i%=0 TO cntfat%-1
- ~BIOS(4,3,L:VARPTR(buffer$),1,i%*secfat%+1,drive% AND 1)
- NEXT i%
- ' Build the disk volume name
- volnam$=CHR$(drive%+65)+":\"+diskname$+CHR$(0)
- handle%=GEMDOS(&H3C,L:VARPTR(volnam$),8) ! Write disk name
- ~GEMDOS(&H3E,handle%)
- bytes%=DFREE(drive%+1)
- ALERT 1,"Format completed.|"+STR$(bytes%)+" bytes available.",1," OK ",dum%
- ELSE
- ' Time for some error messages
- ALERT 1,"Formatting error",1," Abort ",dum% ! Generic "can't format"
- ENDIF ! error
- ELSE
- ALERT 1,"Error:|Incorrect number of sides",1," Abort ",dum%
- ENDIF
- ELSE
- ALERT 1,"Error:|Incorrect drive specified",1," Abort ",dum%
- ENDIF
- RETURN
-